package io.gitee.macxiang.utils;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/** 时间处理 */
public class Times {
  /** 获取一个月的时间范围
   * @param year  年份
   * @param month 月份
   * @return [起始时间,终止时间]
   */
  public static long[] getRangeByYearMonth(int year, int month) {
    return new long[] { getYearMonthBeginTime(year, month),
        getYearMonthEndTime(year, month) };
  }

  /** 获取一个月的开始时间
   * @param year  年份
   * @param month 月份
   * @return 一个月的开始时间
   */
  public static long getYearMonthBeginTime(int year, int month) {
    return YearMonth.of(year, month).atDay(1)
        .atStartOfDay(ZoneId.systemDefault())
        .toInstant().toEpochMilli() / 1000;
  }

  /** 获取一个月的结束时间
   * @param year  年份
   * @param month 月份
   * @return 一个月的结束时间
   */
  public static long getYearMonthEndTime(int year, int month) {
    return YearMonth.of(year, month).atEndOfMonth()
        .atTime(23, 59, 59).atZone(ZoneId.systemDefault())
        .toInstant().toEpochMilli() / 1000;
  }

  /** 取当前时间毫秒数 */
  public static long timeMillis() {
    return System.currentTimeMillis();
  }

  /** 取当前时间秒 */
  public static long time() {
    return System.currentTimeMillis() / 1000;
  }

  /** 取当前时间秒;返回string */
  public static String sTime() {
    return String.valueOf(time());
  }

  /** 取时间字符串格式的秒数 */
  public static long time(String dateStr) {
    try {
      return OffsetDateTime.parse(dateStr).toInstant().toEpochMilli() / 1000;
    } catch (Exception e) {
    }
    return 0L;
  }

  public static String sTime(String dateStr) {
    try {
      return String.valueOf(Long.valueOf(OffsetDateTime.parse(dateStr).toInstant().toEpochMilli() / 1000));
    } catch (Exception e) {
    }
    return "0";
  }

  /** 取Date格式的秒数 */
  public static long time(Date date) {
    return date.getTime() / 1000;
  }

  public static String sTime(Date date) {
    return String.valueOf(time(date));
  }

  /** 取LocalDate格式的秒数 */
  public static long time(LocalDate date) {
    return date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() / 1000;
  }

  public static String sTime(LocalDate calendar) {
    return String.valueOf(time(calendar));
  }

  /** 取Calendar格式的秒数 */
  public static long time(Calendar calendar) {
    return calendar.getTimeInMillis() / 1000;
  }

  public static String sTime(Calendar calendar) {
    return String.valueOf(time(calendar));
  }

  /** 取ISO8601格式当前时间 */
  public static String timeISO8601() {
    Instant now = Instant.now();
    DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
    return formatter.format(now.atOffset(ZoneOffset.of("+08:00")));
  }

  /**格式化时间
   * @param timestamp       时间秒或毫秒
   * @param formatteString  格式化字符串;默认 yyyy-MM-DD HH:mm:ss
   * @return                格式化好的字符串
   */
  public static String l2times(long timestamp, String formatteString) {
    if (formatteString == null) {
      formatteString = "yyyy-MM-dd HH:mm:ss";
    }
    if (timestamp > 1000000000L && timestamp < 10000000000L) {
      timestamp *= 1000;
    }
    Instant instant = Instant.ofEpochMilli(timestamp);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatteString);
    return instant.atZone(ZoneId.systemDefault()).format(formatter);
  }

  /**格式化时间 yyyy-MM-DD HH:mm:ss
   * @param timestamp       时间秒或毫秒
   * @return                格式化好的字符串
   */
  public static String l2times(long timestamp) {
    return l2times(timestamp, null);
  }

  public static long timestampMinute() {
    LocalDateTime now = LocalDateTime.now(),
        truncatedToMinute = LocalDateTime.of(
            now.getYear(), now.getMonth(), now.getDayOfMonth(),
            now.getHour(), now.getMinute(), 0, 0);
    return truncatedToMinute.toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000;
  }
}
